<?php


/*
 *
 * Kontroluje, zda ubehnul timeout od poslední synchronizace
 * $idacc - ID účtu pro synchronizaci
 * @vrací true nebo false
 */
function mailcontent_is_timeout_ok($idacc) {
    $result = db_query("SELECT * FROM {mailcontent_login} WHERE idacc=".$idacc);
    if ($result ) {
        $row = db_fetch_array($result);
        $lastsynchro = strtotime($row['lastsynchro']);
        $timeout = $row['timeout'];
        if ($timeout == 0) {
            return TRUE;
        }
        if ($lastsynchro < strtotime("-".$timeout." minutes")) {
            return TRUE;
        }
    }
    return FALSE;
} //OK

/*
 *
 * Překládá sekvence znaků na české znaky - nutné provést po stahování mailů s použitím Cclient a nahrazuje konce řádků HTML znakem <br> pro prosté maily
 * $string - string k nahrazení znaků
 * $html - nahrazování odřádkování tagy <br>
 * @string - vrácený string je počeštěný
 */
function mailcontent_czech_string($string, $html = 0){
    $search = array("=E1", "=C1", "=E9", "=C9", "=EC", "=CC", "=ED", "=CD", "=F3", "=D3", "=FA", "=DA", "=F9", "=D9", "=FD", "=DD", "=E8", "=C8", "=EF", "=CF", "=F2", "=D2", "=F8", "=D8", "=B9", "=A9", "=BB", "=AB", "=BE", "=AE", "=3D");
    $replace = array("á", "Á", "é", "É", "ě", "Ě", "í", "Í", "ó", "Ó", "ú", "Ú", "ů", "Ů", "ý", "Ý", "č", "Č", "ď", "Ď", "ň", "Ň", "ř", "Ř", "š", "Š", "ť", "Ť", "ž", "Ž", "☺");
    $string = str_replace($search, $replace, $string);
    $string = str_replace("=".chr(13).chr(10), "", $string);
    $string = str_replace("☺", "=", $string);

    if ($html == 0){
        $string = str_replace(chr(13).chr(10).chr(13).chr(10), "<br>", $string);
    }
    
    return $string;
}//OK

/*
 *
 * Kontrola předmětu zprávy, zda jsou všechna klíčová slova v databázi povolených slov a zda začíná mail speciálním klíčovým slovem pro validaci
 * $subject - předmět zprávy
 * @ vrací seznam akcí nebo false, pokud nejsou klíčová slova vpořádku
 *
 */
function mailcontent_is_message_valid($subject) {
    $subject = trim($subject);
    $act[0] = "";
    $result = db_query("SELECT keyword FROM {mailcontent_actions_keywords} as a join {mailcontent_actions} as b on a.ida=b.ida join {mailcontent_keywords} as c on a.idw=c.idw WHERE name='validate'");
    if ($result) {
        while ($row = db_fetch_array($result)) {
            $initialKeyword = $row['keyword'];
            if ($initialKeyword == substr($subject, 0, strlen($initialKeyword))) {
                $subject = substr($subject, strlen($initialKeyword));
                $subject = trim($subject);
                $i = 1;
                $keywords = explode(" ", $subject);
                foreach ($keywords as $value) {
                    if (!db_result(db_query("SELECT * FROM {mailcontent_keywords} WHERE keyword='".$value."'"))) {
                        mailcontent_error_parse(t("Keyword in subject")." <b>".$value."</b> ".t("is not valid!!"));
                        return FALSE;
                    }
                    if (db_result(db_query("SELECT * FROM {mailcontent_keywords} WHERE keyword='".$value."' and class='type'"))) {
                        if ($act[0] == "") {
                            $rs = db_query("SELECT a.name FROM {mailcontent_actions} as a join {mailcontent_actions_keywords} as b on a.ida=b.ida join {mailcontent_keywords} as c on b.idw=c.idw WHERE keyword='".$value."'");
                            $rw = db_fetch_array($rs);
                            $act[0] = $rw['name'];
                        } else {
                            mailcontent_error_parse(t('Multiple type of content in subject')." - ".$value.t(" and ").$act[0]);
                            return FALSE;
                        }
                    } else {
                        $rs = db_query("SELECT a.name FROM {mailcontent_actions} as a join {mailcontent_actions_keywords} as b on a.ida=b.ida join {mailcontent_keywords} as c on b.idw=c.idw WHERE keyword='".$value."' ORDER BY weight DESC");
                        while ($rw = db_fetch_array($rs)) {
                            $act[$i] = $rw['name'];
                            $i++;
                        }
                    }
                }
                if ($act[0] == "") {
                    mailcontent_error_parse(t('In subject is not type of content!! - Email rejected'));
                    return FALSE;
                }
                return $act;
            }
        }
        mailcontent_error_parse(t('In subject is not keyword for validate your content'));
        return FALSE;
    } else {
        mailcontent_error(t('Can not find keyword for validate content'));
        return FALSE;
    }
}//OK

/*
 * Kontroluje, zda má mauilová adresa, ze ktereé přišla zpráva práva na akce, které jsou v klíčových slovech subjektu
 * $mailaddress - adresa odesílatele
 * $idacc - ID účtu pro synchronizaci
 * $actions - pole akcí, které byly rozpoznány z předmětu
 * @vrací true nebo false
 */
function mailcontent_is_mail_valid($mailadress, $idacc, $actions) {
    $result = db_query("SELECT * FROM {mailcontent_subscribers} WHERE (idacc='".$idacc."' or idacc='all') and mailaddress='".$mailadress."'");
    if ($result) {
        $row = db_fetch_array($result);
        if (mailcontent_check_actions($row['idr'], $actions)) {           
            return true;
        } else {
            mailcontent_error(t('Mail address')." ".$mailadress." ".t('has not enough permissions.'));
            return false;
        }
    } else {
        mailcontent_error(t('Mail address')." ".$mailadress." ".t('is not in list of suscribers or has not assigned any role'));
        return true;
    }
    return true;
}//OK

/*
 *
 * Kontroluje, zda je zpráva ve schránce novější, než poslední přijatá zpráva - ochrana proti opětovnému stahování maill ze schránek,
 * kde z nějakého důvodu není správně nastaven příznak pro Cclienta
 * $date - datum zprávy
 * $idacc - ID účtu pro synchronizaci
 * @vrací true nebo false
 */
function mailcontent_is_new_message($date, $idacc) {    
    if (db_result(db_query("SELECT lastmail FROM {mailcontent_login} WHERE idacc=".$idacc))) {
        $result = db_query("SELECT lastmail FROM {mailcontent_login} WHERE idacc=".$idacc);
        $row = db_fetch_array($result);
        if (strtotime($row['lastmail']) < $date) {
            return true;
        } else {
            return false;
        }
    }
    return TRUE;
}//OK

/*
 * Kontroluje, zda jsou pro danou roli povolena předané akce
 * $idr - id role
 * $actions - pole akcí ke kontrole
 * vrací true nebo false
 */
function mailcontent_check_actions($idr, $actions) {
    $result = db_query("SELECT b.name FROM {mailcontent_role_actions} as a join {mailcontent_actions} as b on a.ida=b.ida join {mailcontent_role} as c on a.idr=c.idr WHERE c.idr=".$idr);
    if ($result) {
        while ($row = db_fetch_array($result)) {
            $actionsAsoc[$row["name"]] = 1;
        }
        foreach ($actions as $value) {
            if (!isset($actionsAsoc[$value])) {
                mailcontent_error_permitions(t("You have not permission for action - ").$value);
                return FALSE;
            }
        }
        return TRUE;
    }
    mailcontent_error(t("Can not find any permission for your role.."));
    return FALSE;
}//OK

/*
 * Kontroluje tělo zprávy, zda má veškeré povinné položky pro daný typ, pokud ano zapíše jej do databáze
 * $body - tělo zprávy
 * $act_type - typ mailu
 * $idm - ID mailu v databázi(uložena hlavička)
 *  @ vrací true nebo false, podle toho, jestli bylo vše korektně uloženo nebo se vyskytla chyba
 */
function mailcontent_parse_body($body, $act_type, $idm){
    $node['title'] = strip_tags(mailcontent_parse_body_part($body, 'title'));
    if ($node['title']){
        $node['idm'] = $idm;
        $node['teaser'] = strip_tags(mailcontent_parse_body_part($body, 'teaser'));
        $node['body'] = mailcontent_parse_body_part($body, 'body');
        $node['author'] = strip_tags(mailcontent_parse_body_part($body, 'author'));
        $node['type_art'] = strip_tags(mailcontent_parse_body_part($body, 'type_art'));

        $node['inquiry_question'] = mailcontent_parse_body_parts($body, 'inquiry_question', $idm);
        if ($node['inquiry_question']) {
            foreach ($node['inquiry_question'] as $key => $value) {
                $node['inquiry_question'][$key] = strip_tags($value);
            }
        }

        $node['block'] = mailcontent_parse_body_parts($body, 'block', $idm);
        if ($node['block']) {
            foreach ($node['block'] as $key => $value) {
                $node['block'][$key] = $value;
            }
        }

        $node['start_time'] = strip_tags(mailcontent_parse_body_part($body, 'start_time'));
        if ($node['start_time']){
            db_query("UPDATE {mailcontent_mail} SET datestart='".$node['start_time']."' WHERE idm=".$idm);
        }

        $node['end_time'] = strip_tags(mailcontent_parse_body_part($body, 'end_time'));
        if ($node['end_time']){
            db_query("UPDATE {mailcontent_mail} SET dateexp='".$node['end_time']."' WHERE idm=".$idm);
        }

        switch ($act_type){
            case "article":
                if ($node['body']){
                    if ($node['teaser']){
                    if (mailcontent_db_add_content($node)){
                        return true;
                    } else {
                        mailcontent_error_db('Can not write data to database - saving content (mail #'.$idm.')');
                        return false;
                    }
                    } else {
                        $node['teaser'] = mailcontent_separate_teaser($node['body']);
                    if (mailcontent_db_add_content($node)){
                        return true;
                    } else {
                        mailcontent_error_db('Can not write data to database - saving content (mail #'.$idm.')');
                        return false;
                    }
                    }
                } else {
                    mailcontent_error_parse(t("Missing body in mail, it is not allowed in type article (mail #".$idm.")"));
                    return false;
                }
                break;

            case "schedule":
                if ($node['start_time']) {
                    if ($node['end_time']) {
                        if ($node['body'] && !$node['teaser']){
                            $node['teaser'] = mailcontent_separate_teaser($node['body']);
                        }
                    if (mailcontent_db_add_content($node)){
                        return true;
                    } else {
                        mailcontent_error_db('Can not write data to database - saving content (mail #'.$idm.')');
                        return false;
                    }
                    } else {
                        mailcontent_error_parse(t("Missing end_time in mail, it is not allowed in type schedule (mail #".$idm.")"));
                        return false;
                    }
                } else {
                    mailcontent_error_parse(t("Missing start_time in mail, it is not allowed in type schedule (mail #".$idm.")"));
                    return false;
                }
                break;

            case "task":
                if ($node['end_time']) {
                    if ($node['body'] && !$node['teaser']) {
                        $node['teaser'] = mailcontent_separate_teaser($node['body']);
                    }
                    if (mailcontent_db_add_content($node)){
                        return true;
                    } else {
                        mailcontent_error_db('Can not write data to database - saving content (mail #'.$idm.')');
                        return false;
                    }
                } else {
                    mailcontent_error_parse(t("Missing end_time in mail, it is not allowed in type task (mail #".$idm.")"));
                    return false;
                }
                break;

            case "inquiry":
                if ($node['inquiry_question']){
                    if ($node['body'] && !$node['teaser']) {
                        $node['teaser'] = mailcontent_separate_teaser($node['body']);
                    }
                    if (mailcontent_db_add_content($node)){
                        return true;
                    } else {
                        mailcontent_error_db('Can not write data to database - saving content (mail #'.$idm.')');
                        return false;
                    }
                } else {
                    mailcontent_error_parse(t("Missing end_time in mail, it is not allowed in type task (mail #".$idm.")"));
                    return false;
                }
                break;

            default:
                mailcontent_error_parse(t("This type(".$actions[0].") have not any rules for save to database.. (mail #".$idm.")"));
                return false;
                break;
        }
    } else {
        mailcontent_error_parse(t("Missing title in mail, it is not allowed in any types (".$actions[0].") (mail #".$idm.")"));
        return false;
    }
}//OK

/*
 * Extrahuje ze zadaného stringu string, který by šel použít jako teaser pro článek, hledá od maximální velikosti teaseru první ukončení věty
 * $body - tělo, ze kterého je hledán teaser
 * @ $string - varcí string o maximální určené délce
 */
function mailcontent_separate_teaser($body){
    $result = db_query("SELECT value FROM {mailcontent_servis} WHERE name='teaser_length'");
    if ($result){
        $row = db_fetch_array($result);
        $max_length = $row['value'];
    } else {
         $max_length = 400;
    }

    if (strlen($body) > $max_length) {
        $teaser = substr(strip_tags($body), 0, $max_length);
        $end = strrpos($teaser, ".");
        if ($end < strrpos($teaser, "?")){
            $end = strrpos($teaser, "?");
        } else {
            if ($end < strrpos($teaser, "!")){
                $end = strrpos($teaser, "!");
            }
        }
        if ($end){
            return substr($teaser, 0, $end+1);
        } else {
            $end = strrpos($teaser, " ");
            if ($end){
                return substr($teaser, 0, $end+1)."...";
            } else {
                return $teaser."...";
            }
        }

    } else {
        return $body;
    }
}//OK

/*
 *
 * Extrahuje z těla zadanou část contentu. Pro zadanou část contentu nejprve najde klíčové slovo a v textu najde pro daný content hodnotu
 * Je určen pouze pro content, který smí být v mailu pouze jednou!
 * $body - tělo zprávy
 * $part - část hledaného contentu
 * @ $string - vrací string s hledaným contentem nebo false, pokud není v mailu právě jednou
 */
function mailcontent_parse_body_part($body, $part){
    $i = 0;
    $result = db_query("SELECT keyword FROM {mailcontent_actions_keywords} as a join {mailcontent_actions} as b on a.ida=b.ida join {mailcontent_keywords} as c on a.idw=c.idw WHERE name='".$part."'");
    if ($result){
        while($row = db_fetch_array($result)){
            $start = strpos($body, $row['keyword']) + strlen($row['keyword']);
            if ($start){
                $i++;
                $end = strpos($body, $row['keyword'], $start);
                if ($end){
                    $i++;
                    $content = trim(substr($body, $start, $end - $start));
                }
            }
        }
        if ($i == 2) {
            return ($content);
        } else {
            if ($i < 2){
                mailcontent_warning_parse(t("Missing ").$part.t(" in mail.."));
                return FALSE;
            } else{
                mailcontent_warning_parse(t("Multiple ").$part.t(" in mail.."));
                return FALSE;
            }
        }
    }
}//OK

/*
 *
 * Extrahuje z těla zadanou část contentu. Pro zadanou část contentu nejprve najde klíčové slovo a v textu najde pro daný content hodnoty.
 * Je určen pro content, který se smí v mailu opakovat!
 * $body - tělo zprávy
 * $parts - část hledaného contentu
 * @ $array - vrací pole stringů s hledaným contentem nebo false, pokud najde syntaktickou chybu(neuzavřený párový "tag").
 */
function mailcontent_parse_body_parts($body, $part, $idm = 0){
    $i = 0;
    $in_str = 0;
    $result = db_query("SELECT keyword FROM {mailcontent_actions_keywords} as a join {mailcontent_actions} as b on a.ida=b.ida join {mailcontent_keywords} as c on a.idw=c.idw WHERE name='".$part."'");
    if ($result){
        while($row = db_fetch_array($result)){
            $val = strpos($body, $row['keyword'], $in_str);
            while ($val){
                $i++;
                $in_str = $val + strlen($row['keyword']);
                if ($i % 2 == 1){
                    $start = $val + strlen($row['keyword']);
                } else {
                    $end = $val;
                    $content[$i/2] = trim(substr($body, $start, $end - $start));
                }
                $val = strpos($body, $row['keyword'], $in_str);
            }
        }
        if ($i%2 == 0) {
            return ($content);
        } else {
                mailcontent_error_parse(t("Not closed ").$part.t(" in mail.. (mail #'.$idm.')"));
                return false;
        }
    }
}//OK

?>
